********************************************************************************
* This file replicates the results reported in: 
* "Reforms and Redistribution: Disentangling the Egoistic and Sociotropic 
* Origins of Voter Preferences“
* Bechtel/Liesch Public Opinion Quarterly (forthcoming)
********************************************************************************
version 15
capture log close
clear all
set matsize 5000
set more off

* Set working directory here

* get data
use "POQ_Bechtel_Liesch_Main_Survey.dta", clear

********************************************************************************
/* 
Regressions:

Using ib2. as prefix automatically defines a change of $0 as the reference category
*/
********************************************************************************


********************************************************************************
* Figure 1, DV: 0 (policy not chosen) 1 (policy chosen)
********************************************************************************

reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], cluster(uniqueID)

********************************************************************************
* Figure 2, DV: 0 (policy not chosen) 1 (policy chosen)
********************************************************************************
*** Create a dummy for all conjoints that included negative
* personal income changes. This version of the indicator includes 
* no change in the loss as well as gain category
gen persinclosses_inc0 = IncomePers < 3
gen persincgains_inc0 = IncomePers > 1
tab persinclosses_inc0 IncomePers
tab persincgains_inc0 IncomePers

* Pers. income gains
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if persincgains_inc0 == 1 [pweight = weight], cluster(uniqueID)

* Pers. income losses
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if persinclosses_inc0 == 1 [pweight = weight], cluster(uniqueID)



********************************************************************************
* Figure 3: Subgroup analyses for: Negative versus positive effects on personal income
********************************************************************************
*** Create a dummy variable that is 1 only when respondent benefits from policy
gen rBenefits = 0
replace rBenefits = 1 if IncomePers > 2
tab rBenefits IncomePers

*** Similar indicator for all policy proposals where respondent loses
gen rLoses = 0
replace rLoses = 1 if IncomePers < 2
tab rLoses IncomePers

* R benefits
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if rBenefits == 1 [pweight = weight], cluster(uniqueID)

* R loses
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if rLoses == 1 [pweight = weight], cluster(uniqueID)



********************************************************************************
* Figure 4: Compare effects for different income categories
********************************************************************************
* Generate indicator variable
gen inccat = 0
replace inccat = 1 if income_US_raw > 3 & income_US_raw < 7
replace inccat = 2 if income_US_raw > 6 & income_US_raw < 10
replace inccat = 3 if income_US_raw > 9 & income_US_raw < 14

tab income_US_raw inccat

** inccat = less than $30k
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if inccat == 0 [pweight = weight], cluster(uniqueID)

*** inccat = 30k to 59,999
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if inccat == 1 [pweight = weight], cluster(uniqueID)

*** inccat = $60k to 89,999
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if inccat == 2 [pweight = weight], cluster(uniqueID)

*** inccat = $90k and more
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if inccat == 3 [pweight = weight], cluster(uniqueID)

********************************************************************************
* Figure 5: The Causal Effects of Average Income Changes on Reform Support by Altruism, 
* Nationalism, Partisanship, and Measures of Respondents' Employment Status
********************************************************************************
* Altruism: low
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if altru_high == 0 [pweight = weight], cluster(uniqueID)

* Altruism: high
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if altru_high == 1 [pweight = weight], cluster(uniqueID)

* Nationalism
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if natiID_high == 1 [pweight = weight], cluster(uniqueID)

reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if natiID_high == 0 [pweight = weight], cluster(uniqueID)

* Democrats
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if partyID_US == 2 [pweight = weight], cluster(uniqueID)

* Republicans
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if partyID_US == 1 [pweight = weight], cluster(uniqueID)

* High and low county unemployment
* Counties with high unemployment
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if countyUR_high == 1 [pweight = weight], cluster(uniqueID)

* Counties with low unemployment
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if countyUR_high == 0 [pweight = weight], cluster(uniqueID)

* By industry unemplyoment rate in October 2016, median split
* High unemployment
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if highSectorUnemp == 1 [pweight = weight], cluster(uniqueID)

* Low unemployment
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if highSectorUnemp == 0 [pweight = weight], cluster(uniqueID)

* Employed vs. Unemployed
/*
We estimate two different models to account for the category of those that are 
unemploymed and are not looking for a job anymore.

Employed are only those that chose paid work
*/
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if has_employment == 1 [pweight = weight], cluster(uniqueID)

reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if has_employment == 0 [pweight = weight], cluster(uniqueID)


***** Figure 6, Validation study

* get data
use "POQ_Bechtel_Liesch_Validation_Study.dta", clear

*** Estimation full model, pooled
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k  , cluster(uniqueID)

* Estimation by policy type
bys Conjoint: reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k  , cluster(uniqueID)


*** Estimation full model, candidate
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k if Conjoint == "CandidConjoint", cluster(uniqueID)

*** Estimation full model, health care policy
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k if Conjoint == "HealthCPolConjoint", cluster(uniqueID)

*** Estimation full model, generic
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k if Conjoint == "Normal", cluster(uniqueID)

*** Estimation full model, trade policy
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k if Conjoint == "TradePolConjoint", cluster(uniqueID)


* Figure A.3
use "POQ_Bechtel_Liesch_Main_Survey.dta", clear

reg vote ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], cluster(uniqueID)


* Figure A.4
tobit vote ib2.IncomeUS ib2.IncomePers  ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], ll(1) ul(10) vce(cluster uniqueID)

* Figure A.5
reg acceptedd ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], cluster(uniqueID)

* Figure A.6
*load data
use "POQ_Bechtel_Liesch_Pilot.dta", clear
reg chosen ib2.NFeatIncomeUS ib2.NFeatIncomeP ib2.NFeatIncome1 ib2.NFeatIncome8 ib2.NFeatIncome3, cluster(uniqueID)

* Figure A.7
* load data
use "POQ_Bechtel_Liesch_Main_Survey.dta", clear

* All conjoints
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], cluster(uniqueID)

* Only first comparison
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if conjointno == 1 [pweight = weight], cluster(uniqueID)


* Figure A.8
* All conjoints
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], cluster(uniqueID)

* Extreme profiles
gen extreme = 0
replace extreme = 1 if Income10 > 2 & Income85 > 2 & Income375 > 2 & IncomeUS < 2
replace extreme = 1 if Income10 < 2 & Income85 < 2 & Income375 < 2 & IncomeUS > 2

sort uniqueID conjointno scenario
by uniqueID conjointno: egen extreme_both = mean(extreme)
recode extreme_both (0.5 = 1)

reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if extreme_both == 0 [pweight = weight], cluster(uniqueID)

* Figure A.9
* With weights
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], cluster(uniqueID)

* Without weights
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 , cluster(uniqueID)

* Figure A.10
* Response time summary stats
sum pagesubmit_cj, d
gen fastsubmit = pagesubmit_cj <= r(p50)
label var fastsubmit "Time pagesubmit <= median submit time"

* Slow respondents
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if fastsubmit == 0 [pweight = weight], cluster(uniqueID)

* Fast respondents
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if fastsubmit == 1 [pweight = weight], cluster(uniqueID)

* Figure A.11
* All respondents
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], cluster(uniqueID)

* Attention High
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if screenerCorr == 1 [pweight = weight], cluster(uniqueID)

* Figure A.12
********************************************************************************
/*
This regression estimates the effects for likely voters. 
We compute weights (weightLikelyVoter) that calibrate the sample to mirror the sociodemographic composition of the voting 
population according to the CNN exit poll:
sex:
47% male

age:
10%: 18-24
9% 25-29
17%: 30-39
19%: 40-49
30% 50-64
16%: 65 and older

education:
18%: high school or less
32%: some college
32%: college graduate
18%: postgraduate


Weight to use: weightLikelyVoter
*/
********************************************************************************

*** Full model, weights for likely voter
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weightLikelyVoter], cluster(uniqueID)

* Figure A.13
********************************************************************************
* By national identity, DV: 0 (policy not chosen) 1 (policy chosen)
********************************************************************************
*** SocIDN == 1
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if socidNationality == 1 [pweight = weight], cluster(uniqueID)

*** SocIDN == 2
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if socidNationality == 2 [pweight = weight], cluster(uniqueID)

*** SocIDN == 3
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if socidNationality == 3 [pweight = weight], cluster(uniqueID)

*** SocIDN == 4
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if socidNationality == 4 [pweight = weight], cluster(uniqueID)

*** SocIDN == 5
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if socidNationality == 5 [pweight = weight], cluster(uniqueID)


* Figure A.14
* High income
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if inc_median_high == 1 [pweight = weight], cluster(uniqueID)
* Low income
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if inc_median_high == 0 [pweight = weight], cluster(uniqueID)

* Figure A.15
* Democrats
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if democrat == 1 [pweight = weight], cluster(uniqueID)
* Republicans
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if democrat == 0 [pweight = weight], cluster(uniqueID)

* Figure A.16
* Left
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if leftright_gr==1 [pweight = weight], cluster(uniqueID)

* Center
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if leftright_gr==2 [pweight = weight], cluster(uniqueID)

* Right
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if leftright_gr==3 [pweight = weight], cluster(uniqueID)

* Figure A.17
* Generate an indicator that is equal to 1 for individuals that answered at least 
* two out of the three questions correctly

* Pol. Knowledge: High
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if know_high == 1 [pweight = weight], cluster(uniqueID)

* Pol. Knowledge: Low
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if know_high == 0 [pweight = weight], cluster(uniqueID)

* Figure A.18
* White
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if race == 1 [pweight = weight], cluster(uniqueID)

* Non-white
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if race != 1 [pweight = weight], cluster(uniqueID)

* Figure A.19
* Reload validation study dataset
use "POQ_Bechtel_Liesch_Validation_Study.dta", clear

*** Estimation full model, pooled, first 5
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k if conjointno < 6, cluster(uniqueID)

*** Estimation full model, pooled, first 10
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k if conjointno < 11, cluster(uniqueID)

*** Estimation full model, pooled, all
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k , cluster(uniqueID)

* Figure A.20
********************************************************************************
* Grouped (first 5, second 5, last 5)
********************************************************************************
*** Estimation full model, pooled, first 5
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k if conjointno < 6, cluster(uniqueID)

*** Estimation full model, pooled, second 5
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k if (conjointno >5 & conjointno < 11), cluster(uniqueID)

*** Estimation full model, pooled, last 5
reg chosen ib2.Incomeb18k ib2.Income18less35k ib2.Income35less60k ib2.Income60less100k ib2.Income100k if conjointno > 10, cluster(uniqueID)

* Figure A.21
* get data
use "POQ_Bechtel_Liesch_Main_Survey.dta", clear

* Only first conjoint
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if conjointno == 1 [pweight = weight], cluster(uniqueID)

* First and second
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if (conjointno == 1 | conjointno == 2) [pweight = weight], cluster(uniqueID)

* First, second and third
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if (conjointno == 1 | conjointno == 2 | conjointno == 3) [pweight = weight], cluster(uniqueID)

* First, second, third and fourth
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if (conjointno == 1 | conjointno == 2 | conjointno == 3 | conjointno == 4) [pweight = weight], cluster(uniqueID)

* Figure A.22
* Now each conjoint separately
* Only first conjoint
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if conjointno == 1 [pweight = weight], cluster(uniqueID)

* Second
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if (conjointno == 2) [pweight = weight], cluster(uniqueID)

* Third
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if (conjointno == 3) [pweight = weight], cluster(uniqueID)

* Fourth
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if (conjointno == 4) [pweight = weight], cluster(uniqueID)


* Figure A.23
* Education low
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if educ_high == 0 [pweight = weight], cluster(uniqueID)

* Education high
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if educ_high == 1 [pweight = weight], cluster(uniqueID)

* Figure A.24
* All
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], cluster(uniqueID)

* Run regressions once without implausible combinations and once with
* Without implausible combinations
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if atypical == 0  [pweight = weight], cluster(uniqueID)

* Table A.1
mean agegr18_24 
mean agegr18_24 [pweight = weight]

mean agegr25_44  
mean agegr25_44 [pweight = weight]

mean agegr45_64 
mean agegr45_64 [pweight = weight]

mean agegr65_o 
mean agegr65_o [pweight = weight]

mean male
mean male [pweight = weight]

mean lessThanHighSchool
mean lessThanHighSchool [pweight = weight]

mean highSchoolDegree 
mean highSchoolDegree [pweight = weight]

mean someCollege 
mean someCollege [pweight = weight]

mean bachelor
mean bachelor [pweight = weight]

mean advancedDegree 
mean advancedDegree [pweight = weight]

* Table A.2
sum altruistic, d

sum socidNationality , d

sum democrat, d

sum unemploymentrate, d

sum IndustryUnemp_Oct2016 , d

sum has_employment , d

sum pagesubmit_cj , d

* Table A.3
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 [pweight = weight], cluster(uniqueID)

* Table A.4
* Model without covariates: see table a.3
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 male age i.income_US_raw education [pweight = weight], cluster(uniqueID)

* Table A.5
* Altruism: low
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if altru_high == 0 [pweight = weight], cluster(uniqueID)

* Altruism: high
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if altru_high == 1 [pweight = weight], cluster(uniqueID)

* with interaction 
reg chosen ib2.IncomeUS##altru_high ib2.IncomePers##altru_high ib2.Income10##altru_high ib2.Income85##altru_high ib2.Income375##altru_high  [pweight = weight], cluster(uniqueID)

* Table A.6
* Nationalism: low
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if natiID_high == 0 [pweight = weight], cluster(uniqueID)

* Nationalism: high
reg chosen ib2.IncomeUS b2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if natiID_high == 1 [pweight = weight], cluster(uniqueID)

* Table A.7
* Democrat
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if democrat == 1 [pweight = weight], cluster(uniqueID)


* Republican
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if democrat == 0 [pweight = weight], cluster(uniqueID)

* Interaction
reg chosen ib2.IncomeUS##republican ib2.IncomePers##republican ib2.Income10##republican ib2.Income85##republican ib2.Income375##republican [pweight = weight], cluster(uniqueID)

* Table A.8

* Counties with low unemployment
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if countyUR_high == 0 [pweight = weight], cluster(uniqueID)

* Counties with high unemployment
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if countyUR_high == 1 [pweight = weight], cluster(uniqueID)


* Table A.9

* Low unemployment
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if highSectorUnemp == 0 [pweight = weight], cluster(uniqueID)

* High unemployment
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if highSectorUnemp == 1 [pweight = weight], cluster(uniqueID)

* Table A.10

* Unemployed
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if has_employment == 0 [pweight = weight], cluster(uniqueID)

* Paid Work
reg chosen ib2.IncomeUS ib2.IncomePers ib2.Income10 ib2.Income85 ib2.Income375 if has_employment == 1 [pweight = weight], cluster(uniqueID)

* Interaction
reg chosen ib2.IncomeUS##has_employment  ib2.IncomePers##has_employment  ib2.Income10##has_employment  ib2.Income85##has_employment  ib2.Income375##has_employment [pweight = weight], cluster(uniqueID)


* Table A.11
tab income_US_raw 
tab income_US_raw inc_median_high


